/**
  ******************************************************************************
  * @file    EEPROM_Emulation/inc/eeprom.h 
  * @author  MCD Application Team
  * @version V1.7.0
  * @date    16-December-2016
  * @brief   This file contains all the functions prototypes for the EEPROM 
  *          emulation firmware library.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */ 

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __EEPROM_H
#define __EEPROM_H

/* Includes ------------------------------------------------------------------*/
#include "Includes.h"

/******************在Includes.h中配置项*************************/
/* Variables' number */
#ifndef	NB_OF_VAR
#define NB_OF_VAR             ((uint8_t)0x03)	//16位变量个数
#endif
/* EEPROM start address in Flash */
#ifdef __STM32F1xx_HAL_H	//STM32F1xx系列
#ifndef FLASH_SIZE
#define FLASH_SIZE				(0x10000UL)		//[字节]仿真EEPROM在FLASH中的起始位置,一般为MCU的倒数最后2页
#endif // !FLASH_SIZE

#elif defined FLASH_TYPEERASE_SECTORS	//STM32F4xx系列
#ifndef PAGE_SIZE
#define PAGE_SIZE				(16 * 1024)  /* Page size */
#endif // !PAGE_SIZE
#ifndef START_SECTOR_NO
#define START_SECTOR_NO			10U
#endif // !START_SECTOR_NO
#ifndef EEPROM_START_ADDRESS
#define EEPROM_START_ADDRESS	(FLASH_END - (PAGE_SIZE << 1UL) + 1)
#endif // !EEPROM_START_ADDRESS
#endif // FLASH_TYPEERASE_PAGES
/**************************************************************/

#ifdef __STM32F1xx_HAL_H
#define PAGE_SIZE				FLASH_PAGE_SIZE  /* Page size */

#ifndef EEPROM_START_ADDRESS
#define EEPROM_START_ADDRESS	(FLASH_BASE + FLASH_SIZE - (PAGE_SIZE << 1UL))
#endif // !EEPROM_START_ADDRESS
#endif // FLASH_TYPEERASE_PAGES

/* Pages 0 and 1 base and end addresses */
#define PAGE0_BASE_ADDRESS    ((uint32_t)(EEPROM_START_ADDRESS + 0x0000))
#define PAGE0_END_ADDRESS     ((uint32_t)(EEPROM_START_ADDRESS + (PAGE_SIZE - 1)))
#define PAGE1_BASE_ADDRESS    ((uint32_t)(EEPROM_START_ADDRESS + PAGE_SIZE))
#define PAGE1_END_ADDRESS     ((uint32_t)(PAGE1_BASE_ADDRESS + PAGE_SIZE - 1))


/* Exported constants --------------------------------------------------------*/
/* EEPROM emulation firmware error codes */
#define EE_OK      (uint32_t)HAL_OK
#define EE_ERROR   (uint32_t)HAL_ERROR
#define EE_BUSY    (uint32_t)HAL_BUSY
#define EE_TIMEOUT (uint32_t)HAL_TIMEOUT

/* Used Flash pages for EEPROM emulation */
#define PAGE0                 ((uint16_t)0x0000)
#define PAGE1                 ((uint16_t)1) /* Page nb between PAGE0_BASE_ADDRESS & PAGE1_BASE_ADDRESS*/

/* No valid page define */
#define NO_VALID_PAGE         ((uint16_t)0x00AB)

/* Page status definitions */
#define ERASED                ((uint16_t)0xFFFF)     /* Page is empty */
#define RECEIVE_DATA          ((uint16_t)0xEEEE)     /* Page is marked to receive data */
#define VALID_PAGE            ((uint16_t)0x0000)     /* Page containing valid data */

/* Valid pages in read and write defines */
#define READ_FROM_VALID_PAGE  ((uint8_t)0x00)
#define WRITE_IN_VALID_PAGE   ((uint8_t)0x01)

/* Page full define */
#define PAGE_FULL             ((uint8_t)0x80)

/* Exported types ------------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
uint16_t EE_Init(void);
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data);
uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data);
/*
********************************************************************************
** 函数名称 :	EE_LoadAllVar
** 描    述 :	从EEPROM中加载所有变量到指定的内存RAM中
** 输入参数 :	见函数说明
** 返    回 :	EE_OK：成功，1: 遇到变量不存在或只读出部分变量, 其它：失败
********************************************************************************/
uint16_t EE_LoadAllVar(uint16_t *pRamVar/*[O]指向按照sEEPROM_VAR类型在内存RAM中申请的结构*/);
/*
********************************************************************************
** 描述: 将给定内存RAM中的EEPROM变量首地址中的所有变量保存到EEPROM中. 若某个变量与已经保存的值相等则跳过.
** 返回: EE_OK：成功，其它：失败
********************************************************************************/
int EE_SaveAllVar(uint16_t *pRamVar/*[I]指向按照sEEPROM_VAR类型在内存RAM中申请的结构*/);
/*
********************************************************************************
** 函数名称 :	EE_WriteVar
** 描    述 :	将指定变量写到EEPROM中指定的偏移位置
** 输入参数 :	见函数说明
** 返    回 :	EE_OK：成功，其它：失败
********************************************************************************/
uint16_t EE_WriteVar(uint16_t *pVar,			/*[IN]指向按照2字节对齐在内存RAM中申请的变量*/
					uint16_t offset,			/*[IN]变量在sEEPROM_VAR结构中的偏移双字节量*/
					uint16_t num16);			/*[IN]变量所占双字节个数*/

#endif /* __EEPROM_H */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
